package com.example.javamaday.graph;

/**
 * 深度优先搜索实现 (无向图)
 */
public class DepthFirstSearch {

    private int count;  // 记录当前有多少个个顶点与s顶点相通
    private boolean[] marked;  //索引代表顶点，值表示当前顶点是否已经被搜索

    // 构造深度优先搜索对象，使用深度优先搜索找出G图中s顶点的所有相邻顶点
    public DepthFirstSearch(Graph g, int s) {
        this.marked = new boolean[g.V()];
        this.count = 0;  // 搜索之前设置为0
        dfs(g, s);
    }

    // 使用深度优先搜索找出G图中v顶点的所有相通的顶点
    private void dfs(Graph g, int v) {
        // 设置当前顶点已经搜索
        marked[v] = true;
        for (int w : g.adj(v)) {
            // 判断w顶点是否被搜索过，如果没被搜索，递归调用dfs方法进行深度搜索
            if (!marked[w]) {
                dfs(g, w);
            }
        }
        // 相通顶点数+1
        count++;
    }

    // 判断w顶点与s顶点是否相通
    public boolean marked(int w) {
        return marked[w];  // 是否被搜索过 即 是否相通
    }

    // 获取与顶点相通的所有顶点的个数
    public int count() {
        return count;
    }

    public static void main(String[] args) {
        // 准备一幅图
        Graph graph = new Graph(13);
        graph.addEdge(0, 5);
        graph.addEdge(0, 1);
        graph.addEdge(0, 2);
        graph.addEdge(0, 6);
        graph.addEdge(5, 3);
        graph.addEdge(5, 4);
        graph.addEdge(3, 4);
        graph.addEdge(4, 6);

        graph.addEdge(7, 8);

        graph.addEdge(9, 11);
        graph.addEdge(9, 10);
        graph.addEdge(9, 12);
        graph.addEdge(11, 12);
        // 准备深度优先搜索对象
        DepthFirstSearch search = new DepthFirstSearch(graph, 0);

        // 测试与某个顶点相通的顶点数量
        int count = search.count();
        System.out.println("与顶点0相通的个数为：" + count);
        // 测试某个顶点与起点是否相通
        System.out.println("5和0是否相通：" + search.marked(5));
        System.out.println("7和0是否相通：" + search.marked(7));
    }
}
